typeof 1 // 'number'

typeof '1' // 'string'

typeof undefined // 'undefined'

typeof true // 'boolean'

typeof Symbol() // 'symbol'

typeof null // 'object'

typeof [] // 'object'

typeof {} // 'object'

typeof console // 'object'

typeof console.log // 'function'


let Car = function () {
}

let benz = new Car()

console.log(benz instanceof Car)  // true

let car = new String('Mercedes Benz')

console.log(car instanceof String) // true

let str = 'Covid-19'

console.log(str instanceof String) // false


//typeof主要用来判断基础数据类型，instanceof则是用来判断引用数据类型

//下面是自己实现一个instanceof

function myInstanceof(left, right) {
    // 这里先用typeof来判断基础数据类型，如果是，直接返回false

    if (typeof left !== 'object' || left === null) return false;
    // getProtypeOf是Object对象自带的API，能够拿到参数的原型对象
    let proto = Object.getPrototypeOf(left);
    while (true) {                  //循环往下寻找，直到找到相同的原型对象

        if (proto === null) return false;
        if (proto === right.prototype) return true;//找到相同原型对象，返回true
        proto = Object.getPrototypeof(proto);

    }

}

// 验证一下自己实现的myInstanceof是否OK

console.log(myInstanceof(new Number(123), Number));    // true

console.log(myInstanceof(123, Number));                // false
